/*
    Observacao: A descricao de cada funcao esta no arquivo "stringop.h" que, alem de conter
                os cabecalhos de todas as funcoes deste arquivo, contem tambem as definicoes
                de tipos e de constantes, comentarios e explicacoes.
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "stringop.h"
#include "error.h"
#include "balloc.h"
#include "fileop.h"

// Parametro: Msg - Vetor com todas as mensagens pertinentes ao programa
void mostraMenu(String Msg[]) {
    int i=0;

    printf("\n  Menu:\n\n");
    for(i=0;i<4;i++) printf("  %s\n", Msg[63+i]);
}

// Parametros: Nome    - Contem o nome do aluno
//             RA      - Contem o RA do aluno
//             connect - Contem o conectivo a ser utilizado
void printInfo(String Nome, String RA, String connect) {
    printf("%s%s%s\n", RA, connect, Nome); 
}

// Parametros: Nome  - Nome do aluno
//             Msg   - Vetor com todas as mensagens pertinentes ao programa
void CapsUP(String Nome, String Msg[]) {
    int i;
    char nome[VET_MAX];

    strcpy(nome,Nome);
    for(i = 0; i <= strlen(nome); i++) nome[i] = toupper(nome[i]);      
    printf("%s ", Msg[9]);
    printf("%s\n", nome);
}

// Parametros: Nome  - String a ser convertida
//             Msg   - Vetor com todas as mensagens pertinentes ao programa
void CapsDOWN(String Nome) {
    int i;

    for(i = 0; i <= strlen(Nome); i++) Nome[i] = tolower(Nome[i]);
}

// Parametros: Dado  - Dado a ser trabalhado
//             Vec   - Recebe as partes do nome do aluno
//             STOP  - Contem o caracter delimitador para cada parte do dado
void SpaceBreak(String Dado, String STOP) {
    String dado,
           tok1,
           tok2;
    char   SB[VET_MAX];

    if(strpbrk(Dado,STOP) == NULL) return; // Retorna sem modificar caso nao haja char de STOP em Dado
    dado = (String)MALLOC(sizeof(char)*(strlen(Dado)+1));
    strcpy(dado,Dado);
    tok1 = strtok(dado,STOP);
    tok2 = strtok(NULL,STOP);
    if(tok1 == NULL) {
        FREE(Dado);
        FREE(dado);
        Dado = NULL;
        return; // Retorna com Dado NULL caso nao haja palavra alguma em Dado
    }
    strcpy(SB,tok1); // Grava primeira palavra
    while(tok2!=NULL) {
        strcat(SB,STOP); // Grava delimitador
        strcat(SB,tok2); // Grava demais palavras
        tok2 = strtok(NULL,STOP);
    }
    strcpy(Dado,SB);
    FREE(dado);
    dado = NULL;
}

// Parametros: TEXTO - String a ser quebrada em partes
//             Pch   - Vetor que recebe as partes da string
//             STOP  - Vetor com os caracteres delimitadores para a quebra da string
int VecName(String TEXTO, String pch[], String STOP) {
    String tok,
           texto;
    int    i = 0;

    texto = (String)MALLOC(sizeof(char)*(strlen(TEXTO)+1));
    strcpy(texto,TEXTO);
    tok = strtok(texto,STOP);
    do {
        pch[i] = (String)MALLOC(sizeof(char)*(strlen(tok)+1));
        strcpy(pch[i],tok);
        i++;
        tok =  strtok (NULL,STOP);
    } while(tok!=NULL);
    FREE(texto);
    return i;
}

// Parametros: Nome - Nome do aluno
//             c    - caractere a ser buscado
//             Msg  - Vetor de mensagens pertinentes ao programa
void CharCheck(String Nome, String c, String Msg[]) {
    String pch;
    char   car = c[0];
    char   str[VET_MAX];
    int    conta = 0;

    strcpy(str, Nome); 
    printf("%s ", Msg[14]);
    printf("%c\n", car);
    pch = (String) memchr (str, car, strlen(str));
    while (pch!=NULL) {
        conta++;
        pch =(String) memchr (pch+1, car, strlen(str));
    }
    printf("  %s", Msg[10]);
    printf(" %d\n", conta);
}

// Parametros: texto - String vetorizada cujas partes devem ser imprimidas
//             *pt   - Contador passado por referencia. Faz com que o numero da chamada dessa funcao imprima a parte de numero correspondente de texto[]
//             arg   - numero de argumentos de texto[]
void PrintParts(String texto[], int *pt, int arg) {
    if(*pt>=arg) *pt = 0;
    printf("  %s\n", texto[*pt]);
    *pt = *pt + 1;
}

// Parametro: texto - String da qual deseja-se remover o caractere de final de linha
void Line(String texto) {
    String aux;

    aux = strpbrk(texto, "\n\r");
    *aux = '\0';
}

// Parametros: info  - Registro a ser considerado
//             resto - Apos a quebra feita do registro, esta string contera o resto de registro
//             delim - Delimitador de campos
String pegaCampo(String info, String* resto, String delim) {
    if(*info != '|') { //se for '|' entao o campo esta em branco
        *resto = strpbrk(info, delim);
        **resto = '\0';
        if (*resto != "\n") *resto = *resto + 1;
    }
    else {
        *resto = *resto + 1;  // Se entrou neste 'else' entao *resto apontava para um "|" por isso deve-se passa-lo para frente, para que pegue inicio do proximo campo
        return "";
    }
    return info;
}

// Parametros: i - Quantidade de brancos a serem impressos na tela
void poeBranco(int i) {
    int j;

    for(j = 0; j < i; j++) printf(" ");
    return;
}
